﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorOutputHistory.h
 * @brief  Abaqus Output 适配器 用于读取INP过程中的Output解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-04-17
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTOROUTPUTHISTORY__H__
#define __FITKABAQUSADAPTOROUTPUTHISTORY__H__

#include "FITKAbaqusIOINPAPI.h"
#include "FITKAbaqusAbstractAdaptor.h"
#include "FITKAbaqusGetInterfaceTool.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"
#include "FITK_Interface/FITKInterfaceModel/FITKModelEnum.h"
#include "FITK_Interface/FITKInterfaceStructural/FITKAbaOutputVariables.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(Interface, FITKAbaAbstractStep)
ForwardDeclarNS(Interface, FITKAbaHistoryOutput)
ForwardDeclarNS(Interface, FITKComponentManager)
ForwardDeclarNS(Interface, FITKAbstractModelComponent)
ForwardDeclarNS(Interface, FITKAbstractModel)

namespace Interface
{
	//   enum class OutputVariablesSelectMode;
	enum MeshSurfaceType;
}

namespace IO
{
	/**
	 * @brief Abaqus Output 读写适配器
	 * @author fulipeng (fulipengqd@yeah.net)
	 * @date 2024-03-26
	 */
	class FITKAbaqusIOINPAPI FITKAbaqusAdaptorOutputHistory : public FITKAbaqusAbstractAdaptor
	{
	public:
		explicit FITKAbaqusAdaptorOutputHistory() = default;
		~FITKAbaqusAdaptorOutputHistory() = default;


		/**
		 * @brief 获取适配器数据类型名
		 * @return 适配器数据类型名
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-03-26
		 */
		QString getAdaptorClass() override;

		/**
		 * @brief 设置算例数据对象
		 * @param caseData
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-03-26
		 */
		void setCaseData(AbaqusData::FITKDataCase* caseData);

		/**
		 * @brief 设置分析步数据
		 * @param stepData 分析步
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-18
		 */
		void setStepData(Interface::FITKAbaAbstractStep* stepData);

		/**
		 * @brief 适配器读取
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-03-26
		 */
		bool adaptR() override;

		/**
		 * @brief 适配器写出
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-03-26
		 */
		bool adaptW() override;

	private:

		/**
		 * @brief 读取ContactOutput
		 * @param line 当前行数据
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-17
		 */
		bool readContactOutput(QString line);

		/**
		 * @brief 读取ElementOutput
		 * @param line 当前行数据
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-17
		 */
		bool readElementOutput(QString line);

		/**
		 * @brief 读取NodeOutput
		 * @param line 当前行数据
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-17
		 */
		bool readNodeOutput(QString line);

		/**
		 * @brief 读取集成输出
		 * @param line
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-19
		 */
		bool readIntegratedOutput(QString line);

		/**
		 * @brief 读取增量输出
		 * @param line 当前行数据
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-19
		 */
		bool readIncrementationOutput(QString line);

		/**
		 * @brief 读取能量输出
		 * @param line 当前行数据
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-07-10
		 */
		bool readEnergyOutput(QString line);

		/**
		 * @brief 读取历程输出
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool readHistory();

		/**
		 * @brief 读取Standard类型的可选参数
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool readStandardOptionalParameters();

		/**
		 * @brief 读取Explicit类型的可选参数
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool readExplicitOptionalParameters();

		/**
		 * @brief 读取History
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool readStandardHistory();

		/**
		 * @brief 读取History
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool readExplicitHistory();

		/**
		 * @brief 写出History
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool writeStandardHistory();

		/**
		 * @brief 写出History
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool writeExplicitHistory();


		/**
		 * @brief 写出ContactOutput
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-17
		 */
		bool writeContactOutput();

		/**
		 * @brief 写出ElementOutput
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-17
		 */
		bool writeElementOutput();

		/**
		 * @brief 写出NodeOutput
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-17
		 */
		bool writeNodeOutput();

		/**
		 * @brief 写出集成输出
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-19
		 */
		bool writeIntegratedOutput();

		/**
		 * @brief 写出增量输出
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-19
		 */
		bool writeIncrementationOutput();

		/**
		 * @brief 写出能量输出
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-07-10
		 */
		bool writeEnergyOutput();

		/**
		 * @brief 是否选择可以写出的类型
		 * @param mode 选择的类型
		 * @return 是否可以写出
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-19
		 */
		bool isSelectedModelWrite(Interface::FITKAbaOutputVariable::OutputVariablesSelectMode mode);

		/**
		 * @brief 获取选择模式 字符串转enum
		 * @param str 描述模式的字符串
		 * @return Interface::OutputVariablesSelectMode 选择模式枚举
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-18
		 */
		Interface::FITKAbaOutputVariable::OutputVariablesSelectMode getSelectedMode(QString str);

		/**
		 * @brief 获取getVariable的字符串 通过枚举
		 * @param typeModel 模式枚举
		 * @return 描述模式的字符串
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-18
		 */
		QString getVariableString(Interface::FITKAbaOutputVariable::OutputVariablesSelectMode typeModel);

		/**
		 * @brief 设置作用域
		 * @param type 描述集合类型的枚举
		 * @param str 作用域字符串用于判断作用域
		 * @param isExterior 是否外部
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-18
		 */
		bool setDomain(Interface::FITKModelEnum::FITKModelSetType type, QString str, bool isExterior);

		/**
		 * @brief 获取Set名称
		 * @param comp 集合
		 * @param model 模型
		 * @return 状态 true成功， false失败
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-08-05
		 */
		QString getSetName(Interface::FITKAbstractModelComponent* comp, Interface::FITKAbstractModel* model);

	private:

		/**
		 * @brief 算例数据
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-13
		 */
		AbaqusData::FITKDataCase* _caseData{};

		/**
		 * @brief 分析步（Step）数据
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-18
		 */
		Interface::FITKAbaAbstractStep* _stepData{};

		/**
		 * @brief 输出数据
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		Interface::FITKAbaHistoryOutput* _outputData{};

		/**
		 * @brief 是否显式分析
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-12
		 */
		bool _isExplicit = false;

		/**
		 * @brief 获取接口 工具类
		 * @author fulipeng (fulipengqd@yeah.net)
		 * @date 2024-04-25
		 */
		FITKAbaqusGetInterfaceTool tool;
	};

	Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaHistoryOutput, FITKAbaqusAdaptorOutputHistory, 1);

}

#endif